from django import http
from django.shortcuts import render
from django.views.generic.base import View
from .models import NewsChannel, Article
from django.core.paginator import Paginator, EmptyPage  # 分页（传两个值：对象列表，每页显示多少条值）

class IndexView(View):
    # channel_id这个是不用传参的，默认是第一个频道，page_num默认的页码数量
    def get(self, request, channel_id=1,page_num=1):
        '''新闻列表的展示功能'''
        try:
            # 获取NewsChannel对象（可能会出错，因为ID可能不存在）
            newchannel = NewsChannel.objects.get(id=channel_id)
            # 获取当前频道下的所有类别ID
        except NewsChannel.DoseNotExist:
            return http.HttpResponseForbidden('未找到channelID')
        else:
            # 获取当前频道下的所有类别ID
            # 这个是推导式
            # for category in newchannel.newscategory_set.all()
            # if category 判断是否有category（有的话就可以获得category.id）
            # category.id 判断如果有category就会有category.id
            category_id_list = [category.id for category in newchannel.newscategory_set.all() if category ]

        # 查看的当前频道下的所有文章（只要查到category_id在（in）这个category_id_list就进行返回）
        articles = Article.objects.filter(category_id__in=category_id_list).order_by('id')

        # 创建分页对象（传两个值：对象列表，每页显示多少条值）
        page_obj = Paginator(articles,3)

        # 获取当前页数据
        try: # 捕获预知的异常（传过来不存在的异常）
            page_articles = page_obj.page(page_num)
        except EmptyPage: # 这个包也是在分页器的下面的
            return http.HttpResponseForbidden('未找到相应page_num')

        return render(request, 'newsapp/index.html',{
            # 将资源分享出去
            'articles':page_articles, # 分页数据
            'channel_id':channel_id # 频道
        })

class DetailView(View):

    def get(self,request,article_id):
        '''
        查询新闻详情
        :param request:
        :param article_id:
        :return:
        '''
        try: # 捕捉错误
            article = Article.objects.get(id=article_id)
        except Article.DoesNotExist: # 未找到对应的ID
            return http.HttpResponseForbidden('未找到article_id')
        return render(request,'newsapp/detail.html',{
            'article':article
        })
